package com.dtp.core.handler;

import com.dtp.common.em.ConfigFileTypeEnum;
import com.dtp.core.parser.ConfigParser;
import com.dtp.core.parser.JsonConfigParser;
import com.dtp.core.parser.PropertiesConfigParser;
import com.dtp.core.parser.YamlConfigParser;
import com.google.common.collect.Lists;

import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;

/**
 * 配置处理类
 *
 * @author yanhom
 * @since 1.0.0
 *
 * @remark muse
 **/
public final class ConfigHandler {
    private static final List<ConfigParser> PARSERS = Lists.newArrayList(); // 配置解析器集合

    private ConfigHandler() {
        // 步骤1：获得自定义SPI配置解析类
        ServiceLoader<ConfigParser> loader = ServiceLoader.load(ConfigParser.class);
        for (ConfigParser configParser : loader)
            PARSERS.add(configParser);

        // 步骤2：系统默认3种配置解析器：PropertiesConfigParser、YamlConfigParser和JsonConfigParser
        PARSERS.add(new PropertiesConfigParser());
        PARSERS.add(new YamlConfigParser());
        PARSERS.add(new JsonConfigParser());
    }

    /** 解析配置文件（配置内容：content，配置文件类型：type） */
    public Map<Object, Object> parseConfig(String content, ConfigFileTypeEnum type) throws IOException {
        for (ConfigParser parser : PARSERS)
            if (parser.supports(type)) return parser.doParse(content);
        return Collections.emptyMap();
    }

    /** 获得单例实例对象 */
    public static ConfigHandler getInstance() {return ConfigHandlerHolder.INSTANCE;}
    private static class ConfigHandlerHolder {
        private static final ConfigHandler INSTANCE = new ConfigHandler();
    }
}
